home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Online / SpeakFreely / src / lpc10 / encode.c < prev    next >
C/C++ Source or Header  |  2000-05-18  |  4KB  |  150 lines

  1. /******************************************************************
  2. *
  3. *    ENCODE Version 48
  4. *
  5. ******************************************************************
  6. *
  7. *  Quantize LPC parameters for transmission
  8. *
  9. * INPUTS:
  10. *  ORDER  - Number of RC's
  11. *  VOICE  - Half frame voicing decisions
  12. *  PITCH  - Pitch
  13. *  RMS    - Energy
  14. *  RC     - Reflection coefficients
  15. *  CORRP  - Error Correction: TRUE = yes, FALSE = none
  16. * OUTPUTS:
  17. *  IPITCH - Coded pitch and voicing
  18. *  IRMS   - Quantized energy
  19. *  IRC    - Quantized reflection coefficients
  20. *
  21. */
  22.  
  23. #include "config.ch"
  24. #include "lpcdefs.h"
  25. #include <math.h>
  26.  
  27. int enctab[16]={0,7,11,12,13,10,6,1,14,9,5,2,3,4,8,15};
  28. int entau[60]={19,11,27,25,29,21,23,22,30,14,15,7,39,
  29.          38,46,42,43,41,45,37,53,49,51,50,54,52,
  30.          60,56,58,26,90,88,92,84,86,82,83,81,85,
  31.          69,77,73,75,74,78,70,71,67,99,97,113,112,
  32.          114,98,106,104,108,100,101,76};
  33. int enadd[8]={1920,-768,2432,1280,3584,1536,2816,-1152};
  34. float enscl[8]={.0204,.0167,.0145,.0147,.0143,.0135,.0125,.0112};
  35. int enbits[8]={6,5,4,4,4,4,3,3};
  36. int entab6[64]={0,0,0,0,0,0,1,1,1,1,1,1,1,
  37.     2,2,2,2,2,2,2,3,3,3,3,3,3,3,4,4,4,4,4,4,4,
  38.     5,5,5,5,5,6,6,6,6,6,7,7,7,7,7,8,8,8,8,
  39.           9,9,9,10,10,11,11,12,13,14,15};
  40. int rmst[64]={1024,936,856,784,718,656,600,550,
  41.           502,460,420,384,352,328,294,270,
  42.           246,226,206,188,172,158,144,132,
  43.           120,110,102,92,84,78,70,64,
  44.           60,54,50,46,42,38,34,32,
  45.           30,26,24,22,20,18,17,16,
  46.           15,14,13,12,11,10,9,8,
  47.           7,6,5,4,3,2,1,0};
  48.  
  49.  
  50. encode(voice, pitch, rms, rc, ipitch, irms, irc )
  51. int voice[2], *pitch;
  52. float *rms, rc[ORDER];
  53. int *ipitch, *irms, irc[ORDER];
  54. {
  55. int i, j, i2, i3, mrk, nbit, idel;
  56. float ftemp;
  57. int itemp;
  58.  
  59. /*  Scale RMS and RC's to integers */
  60.  
  61. *irms = *rms;
  62.  
  63. for(i=1;i<=ORDER;i++)
  64.     irc[i] = rc[i] * 32768;
  65.  
  66.     
  67. /*  Encode pitch and voicing    */
  68.  
  69. if(voice[1]!=0&&voice[2]!=0) 
  70.     *ipitch = entau[*pitch-1];
  71. else
  72.     *ipitch = 0;
  73.     if(voice[1]!=voice[2]) *ipitch = 127;
  74.  
  75. /*  Encode RMS by binary table search    */
  76.  
  77. j = 32;
  78. idel = 16;
  79. *irms = mmin(*irms,1023);
  80. while(idel>0)    {
  81.     if (*irms>rmst[j-1]) j -= idel;
  82.     if (*irms<rmst[j-1]) j += idel;
  83.     idel *= 0.5;
  84. }
  85. if (*irms>rmst[j-1]) j--;
  86. *irms = 31 - j*0.5;
  87.  
  88. /*  Encode RC(1) and (2) as log-area-ratios    */
  89.  
  90. for(i=1;i<=2;i++)    {
  91.     i2 = irc[i];
  92.     mrk = 0;
  93.     if(i2<0) {
  94.         i2 = -i2 ;
  95.         mrk = 1;
  96.     }
  97.     i2 = i2>>9;
  98.     i2 = mmin(i2,63);
  99.     i2 = entab6[i2];
  100.     if(mrk!=0) i2 = -i2;
  101.     irc[i] = i2;
  102. }
  103.  
  104. /*  Encode RC(3) - (10) linearly, remove bias then scale    */
  105.  
  106. for(i=3;i<=ORDER;i++)    {
  107.     i2 = irc[i]>>1;
  108. /*    i2 = (i2+enadd[ORDER-i])*enscl[ORDER-i]; */
  109.     /* problem with truncating negative numbers */
  110.     if(enadd[ORDER-i] < 0) { 
  111.       ftemp = -(i2+enadd[ORDER-i])*enscl[ORDER-i];
  112.       itemp = ftemp;
  113.           i2 = -itemp;
  114.     }
  115.     else
  116.           i2 = (i2+enadd[ORDER-i])*enscl[ORDER-i];
  117.  
  118. /*****    i2 = mmin(mmax(i2,-127),127);    *****/
  119.     if( (i2 < -127) || (i2 > 127))
  120.       if(i2 < -127)
  121.         i2 = -127;
  122.       else
  123.         if (i2> 127)
  124.           i2 = 127;
  125.  
  126.     nbit = enbits[ORDER-i];
  127.     i3 = 0;
  128.     if(i2<0) i3 = -1;
  129.     /*i2 = i2/pow(2.,(float)nbit);*/
  130.     i2 = i2 / (2 << (nbit-1));
  131.     if(i3==-1) i2--;
  132.     irc[i] = i2;
  133. }
  134.  
  135. /*          Protect the most significant bits of the most
  136. *     important parameters during non-voiced frames.
  137. *     RC(1) - RC(4) are protected using 20 parity bits
  138. *     replacing RC(5) - RC(10). */
  139.  
  140. if(*ipitch==0||*ipitch==127) {
  141.     irc[5] = enctab[(irc[1]&30)>>1];
  142.     irc[6] = enctab[(irc[2]&30)>>1];
  143.     irc[7] = enctab[(irc[3]&30)>>1];
  144.     irc[8] = enctab[(*irms&30)>>1];
  145.     irc[9] = enctab[(irc[4]&30)>>1]>>1;
  146.     irc[10]= enctab[(irc[4]&30)>>1]&1;
  147. }
  148.  
  149. }
  150.